package movie.util;

import java.text.*;
import java.util.*;

/**
 * 键盘录入工具类
 * @author 王荣
 *
 */
public class ScannerUtil {
	private static Scanner sc = new Scanner(System.in);
	

	/**
	 * 从控制台按指定的要求获取输入的一行数据
	 * @param limit  输入字符的最大值
	 * @param balnkRetrun  是否可以为空
	 * @return String  控制台输入的字符串
	 */
	public static String readKeyBoard(int limit, boolean blankRetrun){
		while(true){
			//获取一行数据，并去空格
			String line = sc.nextLine().trim();
			
	       //条件1： 指定是否让键盘录入的位置可以录入空值
			if( line.length() == 0){
				//如果blankRetrun为true，就允许为空
				if(blankRetrun == true){
					return line;
				}else{//不能为空，必须输入选项才行
					continue;
				}
			}
			
			//条件2： 设置字符的长度：输入的字符长度不能超出你指定的字符长度
			if( line.length() > limit){
				System.out.println("输入长度有误(不能大于"+ limit +"),请重新输入");
			    continue;//输错了就结束当次循环，重新循环，直到输对了为止
			}
			
			//当上面两个条件都没实现，表示数据格式正确，返回line
			return line;
		}
	}
	
	
	/**
	 * 从控制台获取数字的方法
	 * @return 返回键盘录入的数字
	 */
	public static int readInt(){
		while(true){
			//调用键盘录入的放方法
			String str = readKeyBoard(10, false);
			int num = 0;
			//输入非数字，提示格式不正确，并结束当次循环
			try {
				num = Integer.parseInt(str);
			} catch (Exception e) {
				System.out.print("ID格式不正确，请重新输入：");
				continue;
			}
			return num;
		}
	}
	
	
	/**
	 * 从控制台获取字符1~number
	 * @param num 可输入字符1~number
	 * @return 返回键盘录入的字符
	 */
	public static char readMenuSelection(int number){
		while(true){
			//调用键盘录入的放方法
			String line = readKeyBoard(1, false);
			
			//将可以输入的字符装进字符串
			String str = "";
			for(int i = 1;i <= number;i++){
				str += i;	
			}
			
			//如果可输入字符中包含键盘录入的字符，转为字符返回
			if(str.contains(line)) {
				return line.charAt(0);
			}else{
				//如果可输入字符中不包含键盘录入的字符，结束当次循环，继续循环
				System.out.print("输入有误，请重新输入：");
				continue;
			}
		}	
	}
	
	
	 /**
     * 键盘录入字符串的方法
     * @param limit 输入字符最大值
     * @param defaultValue 默认值
     * @return 输入为空返回默认值，不为空返回字符串
     */
    public static String readString(int limit,String defaultValue){
    	//调用键盘录入的放方法,并将字符串改为大写
		String line = readKeyBoard(limit, true);
    	
		//如果输入为空返回默认值，不为空返回字符串
    	return  "".equals(line) ? defaultValue : line;
    }
    
	
	/**
	 * 键盘录入日期的方法
	 * @param format 日期格式
	 * @param blankRetrun 是否可以为空
	 * @return 
	 */
	public static Date readDate(String format, boolean blankRetrun){
		Date date = null;
		
		while(true){
			//调用键盘录入的方法
			String str = readKeyBoard(format.length(), blankRetrun);
			
			//如果键盘录入可以为空，并且为空时返回null
			if(blankRetrun == true){
				if("".equals(str))	return null;
			}
			
			//字符串日期转换为日期格式
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			
			//如果格式错误，提示并结束当次循环
			try {
				date = sdf.parse(str);
			} catch (ParseException e) {
				System.out.println("日期格式不对，请重新输入");
				continue;
			}
		
			//如果格式正确，返回date
			return date;
		}
	}
	
	
	/**
	 * (重写)键盘录入日期的方法
	 * @param format 日期格式
	 * @param defaultValue 默认值
	 * @return 输入为空返回默认值，不为空返回date
	 */
	public static Date readDate(String format,Date defaultValue){
		//调用键盘录入日期的方法
		Date date = readDate(format, true);
		
		//如果输入为空返回默认值，不为空返回date
		return  date == null ? defaultValue : date;	
	}
	
	
	/**
	 * 键盘录入Y和N的方法
	 * @return Y和N
	 */
    public static char readYN() {
		while(true) {
			//调用键盘录入的放方法,并将字符串改为大写
			String line = readKeyBoard(1, false).toUpperCase();
			
			//将字符串转为字符格式
			char c = line.charAt(0);
			
			//如果输入的是Y或N，返回c
		    if (c == 'Y' || c == 'N') {
			    return c;
		    }else{
		    	//如果输入的不是Y或N,结束当次循环，继续循环
		    	System.out.print("选择错误，请重新输入：");
		    	continue;
		    }
		}
    }

    
  
    
    
   
    
  
}
